Google Cloud の Workflows で Batch を呼び出してみた

Google Cloud の Workflows で Batch を呼び出してみた

Clock Icon2024.10.29

Google Cloud データエンジニアのはんざわです。
今回のブログでは、Google Cloud の Workflows で Batch を呼び出してみたいと思います。

Batch の概要や特徴などは過去のブログを参照してください。

https://dev.classmethod.jp/articles/google-cloud-try-batch

やりたいこと

今回のブログでやりたいことは以下のとおりです。

  • Workflows で Batch のジョブを作成する
  • Workflows を手動で呼び出す
  • ジョブの構成自体は前回のブログの内容と同じ

https://dev.classmethod.jp/articles/google-cloud-batch-script-mount-cloud-storage/

イメージとしては、以下のような構成図になります。

exec-workflows-batch.drawio (4)

また、今回の検証は下記の公式ドキュメントを参考にしています。
併せて、確認してください。

https://cloud.google.com/workflows/docs/tutorials/batch-and-workflows?hl=ja

事前準備

一部のリソースは、前回の検証で使用したものを再利用します。

  • Batch のジョブを実行するサービスアカウント
  • 圧縮されたファイルを保管する Cloud Storage
  • 解凍したファイルを保管する Cloud Storage
  • Batch にマウントする Cloud Storage
  • 実行するスクリプト

1. サービスアカウントの作成

Workflows を実行するサービスアカウントを新たに作成し、以下の3つの権限を付与します。

  • バッチジョブ編集者(roles/batch.jobsEditor
  • サービスアカウントユーザー(roles/iam.serviceAccountUser
  • ログ書き込み(roles/logging.logWriter
# サービスアカウントを作成
$ gcloud iam service-accounts create sa-workflows

# roles/batch.agentReporter の権限を付与
$ gcloud projects add-iam-policy-binding <PROJECT_ID> \
    --member="serviceAccount:sa-workflows@<PROJECT_ID>.iam.gserviceaccount.com" \
    --role="roles/batch.jobsEditor" \
    --condition None

# roles/iam.serviceAccountUser の権限を付与
$ gcloud projects add-iam-policy-binding <PROJECT_ID> \
    --member="serviceAccount:sa-workflows@<PROJECT_ID>.iam.gserviceaccount.com" \
    --role="roles/iam.serviceAccountUser" \
    --condition None

# roles/logging.logWriter の権限を付与
$ gcloud projects add-iam-policy-binding <PROJECT_ID> \
    --member="serviceAccount:sa-workflows@<PROJECT_ID>.iam.gserviceaccount.com" \
    --role="roles/logging.logWriter" \
    --condition None

2. Workflows の作成

次に Batch のジョブ作成と実行を行う Workflows を作成します。
Workflows の構成は、以下のとおりです。

構成名 入力内容
ワークフロー名 exec-batch-job
ワークフローの説明 省略
リージョン asia-northeast1(東京)
サービスアカウント sa-workflows@<PROJECT_ID>.iam.gserviceaccount.com
呼び出しログレベル 指定なし
暗号化 Google が管理する暗号鍵
環境変数 省略
ラベル 省略
トリガー 省略

また、ワークフローの定義は以下のとおりです。

main:
    steps:
        - init:
            assign:
                - project: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                - location: ${sys.get_env("GOOGLE_CLOUD_LOCATION")}
        - createAndRunBatchJob:
            call: googleapis.batch.v1.projects.locations.jobs.create
            args:
                parent: ${"projects/" + project + "/locations/" + location}
                body:
                    taskGroups:
                        taskSpec:
                            runnables:
                                - script:
                                    path: "/scripts/script.sh"
                            computeResource:
                                cpuMilli: "500"
                                memoryMib: "500"
                            environment:
                                variables:
                                    FILE_PATH: "test/sample.csv.gz"
                                    INPUT_BUCKET: "hanzawa-yuya-compressed-files"
                                    OUTPUT_BUCKET: "hanzawa-yuya-uncompressed-files"
                            volumes:
                                - gcs:
                                    remotePath: "hanzawa-yuya-batch-mount/test"
                                  mountPath: "/scripts"
                    allocationPolicy:
                        instances:
                            - policy:
                                machineType: "e2-micro"
                                provisioningModel: "STANDARD"
                        location:
                            allowedLocations:
                                - ${"regions/" + location}
                        serviceAccount:
                            email: ${"sa-batch@" + project + ".iam.gserviceaccount.com"}
                    logsPolicy:
                        "destination": "CLOUD_LOGGING"
            result: createAndRunBatchJobResponse

参考ドキュメント

https://cloud.google.com/workflows/docs/samples/workflows-connector-batch?hl=ja

https://cloud.google.com/workflows/docs/reference/googleapis/batch/v1/projects.locations.jobs/create

https://cloud.google.com/batch/docs/reference/rest/v1/projects.locations.jobs

動かしてみる

早速、作成した Workflows を動かしてみたいと思います。
コンソールから作成した exec-batch-job -> 実行 を選択し、手動で呼び出します。

Workflows と Batch の実行タイミングを確認します。それぞれ以下のとおりです。

  • Workflows

スクリーンショット 2024-10-29 10.49.35

  • Batch

スクリーンショット 2024-10-29 10.50.44

さらに表にまとめると次のようになります。

時間 サービス ステータス
10:44:41 Workflows 実行開始
10:44:44 Batch QUEUED から SCHEDULED に変更
10:45:49 Batch SCHEDULED から RUNNING に変更
10:45:53 Batch RUNNING から SUCCEEDED に変更
10:46:13 Workflows 実行終了

この結果からわかるように、Workflows から Batch を呼び出すと同期でレスポンスが返ってきています。(= つまり、Batch の処理が終わってから Workflows が次のステップに進む)

また、解凍処理が正常に完了していることが確認できました。

まとめ

今回のブログでは、Google Cloud の Workflows で Batch を呼び出す方法を紹介しました。
この検証では、手動で Workflows を実行しましたが、もちろん Cloud Scheduler などから変数と一緒に呼び出し、柔軟性が高くすることも可能です。
是非、試してみてください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.